package fiuba.algo3.algothief.modelo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class Ladron {

	private String nombre;
	private String sexo;
	private String hobby;
	private String cabello;
	private String senia;
	private String vehiculo;
	private ArrayList<Pais> paisesAEscapar;
	private Lugar lugarEnElQueSeEncuentra;
	private Strategy estrategia;
	private int siguientePais;

	public Ladron(String nombre, String sexo, String hobby,
			String cabello, String senia, String vehiculo, Strategy estrategia)  throws ParserConfigurationException, TransformerException, SAXException, IOException {
		this.nombre = nombre;
		this.sexo = sexo;
		this.hobby = hobby;
		this.cabello = cabello;
		this.senia = senia;
		this.vehiculo = vehiculo;
		this.estrategia = estrategia;
		this.paisesAEscapar = new ArrayList<Pais>();
		this.ejecutarEstrategia();
		this.esconderse(this.getPaisEnElQueSeEncuentra());
		this.siguientePais = 0;
	}
	
	
	public Ladron() {
		
	}

	public String getNombre() {
		return this.nombre;
	}

	public String getSexo() {
		return this.sexo;
	}

	public String getHobby() {
		return this.hobby;
	}

	public String getCabello() {
		return this.cabello;
	}

	public String getSenia() {
		return this.senia;
	}

	public String getVehiculo() {
		return this.vehiculo;
	}

	public Pais getPaisEnElQueSeEncuentra() {
		return this.paisesAEscapar.get(paisesAEscapar.size()-1);
	}
	
	public ArrayList<Pais> getPaisesAEscapar() {
		return this.paisesAEscapar;
		
	}
	
	public Pais getSiguientePais() throws ParserConfigurationException, TransformerException, SAXException, IOException {
		if (siguientePais < this.getCantidadPaisesAEscapar())
			return this.paisesAEscapar.get(siguientePais);
		else {
			ListaPaises paises = new ListaPaises ();
			siguientePais = this.getCantidadPaisesAEscapar() -1 ;
			return paises.seleccionarPaisAleatorio();
			
		}	
		
	}

	public void ejecutarEstrategia() throws ParserConfigurationException, TransformerException, SAXException, IOException {
		ArrayList<Pais> paises = new ArrayList<Pais>();		
		ListaPaises listaPaises = new ListaPaises();
		listaPaises.generarXML(paises);
		int tamanioArray = paises.size();	
		Random rand = new Random();
		int posAleatoria;
		posAleatoria = rand.nextInt(tamanioArray-1);
		for (int i=0; (i<estrategia.CantidadPaisesDeEscape()); i++) {			
			do {
				posAleatoria = rand.nextInt(tamanioArray-1);
			} while (comprobarSiContiene(paisesAEscapar,paises,posAleatoria));
			paisesAEscapar.add(paises.get(posAleatoria));
		}		
	}
	
	public void esconderse (Pais unPais) {
		ArrayList<Lugar> lugares = unPais.getLugares();
		Random rand = new Random();
		int posAleatoria;
		int tamanioLugares = lugares.size();
		posAleatoria = rand.nextInt(tamanioLugares-1);
		this.lugarEnElQueSeEncuentra = (lugares.get(posAleatoria));
	}
	
	public boolean comprobarSiContiene(ArrayList<Pais> paisesAEscapar, ArrayList<Pais> paises, int posAleatoria) {
		if ((paisesAEscapar.size() > 0) && paisesAEscapar.contains(paises.get(posAleatoria)))
			return true;
		return false;	
	}
	
	public Element serializar(Document doc) {
		Element elementoLadron = doc.createElement("Ladron");
		elementoLadron.setAttribute("nombre",this.nombre);
		elementoLadron.setAttribute("sexo",this.sexo);
		elementoLadron.setAttribute("hobby",this.hobby);
		elementoLadron.setAttribute("cabello",this.cabello);
		elementoLadron.setAttribute("senia",this.senia);
		elementoLadron.setAttribute("vehiculo",this.vehiculo);
		return elementoLadron;	
	}
	
	public static Ladron hidratar(Document doc) {
		Ladron nuevoLadron = new Ladron();
		Element elementoLadron = (Element)doc.getElementsByTagName("Ladron").item(0);
		nuevoLadron.nombre = elementoLadron.getAttribute("nombre");
		nuevoLadron.sexo = elementoLadron.getAttribute("sexo");
		nuevoLadron.hobby = elementoLadron.getAttribute("hobby");
		nuevoLadron.cabello = elementoLadron.getAttribute("cabello");
		nuevoLadron.senia = elementoLadron.getAttribute("senia");
		nuevoLadron.vehiculo = elementoLadron.getAttribute("vehiculo");
		return nuevoLadron;
		
	}


	public void cambiarSiguientePais() {
		this.siguientePais++;
		
	}


	public int getCantidadPaisesAEscapar() {
		return paisesAEscapar.size();
	}


	public int getPosicionSiguientePais() {
		return this.siguientePais;
	}


	public Lugar getLugarEnElQueSeEncuentra() {
		return this.lugarEnElQueSeEncuentra;
	}
	
	public void setearPistasConAtributos () {
		String pista1,pista2,pista3,pista4;
		pista1 = " y el cabello del ladron es " + this.getCabello();
		pista2 = " y el hobby del ladron es " + this.getHobby();
		pista3 = " y la senia del ladron es " + this.getSenia();
		pista4 = " y el vehiculo del ladron es " + this.getVehiculo();

		this.paisesAEscapar.get(0).getLugar(0).pistaFacil.setContenido(pista1);
		this.paisesAEscapar.get(0).getLugar(1).pistaMedia.setContenido(pista2);
		this.paisesAEscapar.get(0).getLugar(2).pistaDificil.setContenido(pista3);				

		this.paisesAEscapar.get(1).getLugar(2).pistaFacil.setContenido(pista3);
		this.paisesAEscapar.get(1).getLugar(1).pistaMedia.setContenido(pista4);
		this.paisesAEscapar.get(1).getLugar(0).pistaDificil.setContenido(pista1);	
		
		this.paisesAEscapar.get(2).getLugar(1).pistaFacil.setContenido(pista4);
		this.paisesAEscapar.get(2).getLugar(1).pistaMedia.setContenido(pista1);
		this.paisesAEscapar.get(2).getLugar(1).pistaDificil.setContenido(pista2);
		
		this.paisesAEscapar.get(3).getLugar(2).pistaFacil.setContenido(pista2);
		this.paisesAEscapar.get(3).getLugar(0).pistaMedia.setContenido(pista3);
		this.paisesAEscapar.get(3).getLugar(2).pistaDificil.setContenido(pista4);
		
	}

}
